//package com.xqboss.apps.config.socket;
//
//
//import cn.hutool.core.text.StrSplitter;
//import cn.hutool.core.util.ObjUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONUtil;
//import com.xqboss.apps.enums.consumer.InteractMsgEnum;
//import com.xqboss.apps.vo.websocket.SocketVo;
//import com.xqboss.common.core.domain.R;
//import com.xqboss.common.utils.LocalDateUtils;
//import com.xqboss.common.utils.spring.SpringUtils;
//import com.xqboss.framework.web.service.TokenService;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.List;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
///**
// * @author Administrator
// */
//@ServerEndpoint("/apps/websocket/{token}")
//@Component
//public class WebSocketServer {
//
//    //与某个客户端的连接会话，需要通过它来给客户端发送数据
//    private Session session;
//
//    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
//    //虽然@Component默认是单例模式的，但springboot还是会为每个websocket连接初始化一个bean，所以可以用一个静态set保存起来。
//    //  注：底下WebSocket是当前类名
//    private static CopyOnWriteArraySet<WebSocketServer> webSockets = new CopyOnWriteArraySet<>();
//    // 用来存：在线连接数
//    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
//    private static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
//    private static final TokenService tokenService = SpringUtils.getBean(TokenService.class);
//
//
//    private String getUserId(String token) {
//        try {
//            String userId = tokenService.getUseridFromToken(token);
//            return userId;
//        } catch (Exception e) {
//            log.error("websocket>>>解析失败>>getUserId" + token, e);
//            return null;
//        }
//    }
//
//    /**
//     * 链接成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session, @PathParam(value = "token") String token) {
//        try {
//            final String userId = getUserId(token);
//            if (StrUtil.isNotBlank(userId)) {
//                this.session = session;
//                webSockets.add(this);
//                sessionPool.put(userId, session);
//
//                log.info("【websocket消息】有新的连接，总数为：{}, 线程map中：{}", webSockets.size(), JSONUtil.toJsonStr(sessionPool.keySet()));
//                sendMessage(session, "连接成功");
//            } else {
//                log.info("websocket>>>连接创建>>解析失败>>" + token);
//                sendMessage(session, "解析错误连接失败");
//            }
//
//        } catch (Exception e) {
//            log.error("WebSocketServer.onOpen()链接失败原因：", e);
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 发送消息，每次浏览器刷新，session会发生变化。（同步发送 getBasicRemote）
//     *
//     * @param session
//     * @param message
//     */
//    public static void sendMessage(Session session, String message) {
//        try {
////            session.getBasicRemote().sendText(String.format("%s (From Server，Session ID=%s)", message, session.getId()));
//            session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            log.error("发送消息出错：{}", e.getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 异步发送（推荐使用 getAsyncRemote）
//     *
//     * @param session
//     * @param message
//     */
//    public static void sendAsyncMessage(Session session, String message) {
//        session.getAsyncRemote().sendText(message);
//    }
//
//    /**
//     * 链接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        try {
//            webSockets.remove(this);
//
//            log.info("【websocket消息】连接断开，总数为:" + webSockets.size());
//        } catch (Exception e) {
//            log.error("WebSocketServer.onClose()链接关闭错误原因：", e);
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message
//     */
//    @OnMessage
//    public void onMessage(String message) {
////        log.info("【websocket消息】收到客户端消息:" + message);
//        if (StrUtil.equals(message, "Ping")) {
//            R<SocketVo> ping = R.ok(new SocketVo("", "", this.session.getId(), LocalDateUtils.getCurrentLocalDateTime(), null, null, "", ""), "Pong");
//            String str = JSONUtil.toJsonStr(ping);
//            sendAsyncMessage(this.session, str);
//        }
//    }
//
//    /**
//     * 发送错误时的处理
//     *
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.info("用户错误,原因:" + error.getMessage());
////        error.printStackTrace();
//    }
//
//    // 此为广播消息
//    public static void sendAllMessage(String message) {
//        log.info("【websocket消息】广播消息:" + message);
//        for (WebSocketServer webSocket : webSockets) {
//            try {
//                if (webSocket.session.isOpen()) {
//                    webSocket.session.getAsyncRemote().sendText(message);
//                }
//            } catch (Exception e) {
//                log.error("广播消息出错：", e);
//                e.printStackTrace();
//            }
//        }
//    }
//
//    // 此为单点消息
//    public void sendOneMessage(String userId, String message, InteractMsgEnum type, Long sourceId) {
//        Session session = sessionPool.get(userId);
//        if (session != null && session.isOpen()) {
//            try {
//                log.info("【websocket消息】 单点消息userId：{}, 内容：{}, 类型：{}", userId, message, type);
//                String avatar = "";
//                String toUserId = "";
//                if (ObjUtil.equal(type.getValue(), InteractMsgEnum.TEAM_SUPPORT.getValue())
//                        || ObjUtil.equal(type.getValue(), InteractMsgEnum.TEAM_LOVE.getValue())) {
//                    List<String> result = StrSplitter.split(message, ",+", 0, true, true);
//                    message = result.get(0);
//                    avatar = result.get(1);
//                    toUserId = result.get(2);
//                }
//                R<SocketVo> pong = R.ok(new SocketVo(userId, toUserId, session.getId(), LocalDateUtils.getCurrentLocalDateTime(), type.getValue(), sourceId, message, avatar));
//                String str = JSONUtil.toJsonStr(pong);
//                session.getAsyncRemote().sendText(str);
//            } catch (Exception e) {
//                log.error("单点消息出错：" + e);
//                e.printStackTrace();
//            }
//        } else {
//            log.info("没找到目前已经建立连接的用户，即要推送给的用户目前没登录");
//        }
//    }
//
//    // 此为单点消息(多人)
//    public void sendMoreMessage(String[] userIds, String message) {
//        for (String userId : userIds) {
//            Session session = sessionPool.get(userId);
//            if (session != null && session.isOpen()) {
//                try {
//                    log.info("【websocket消息】 单点消息:" + message);
//                    session.getAsyncRemote().sendText(message);
//                } catch (Exception e) {
//                    log.error("单点消息(多人)出错：" + e);
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//}